// 第18节：索引：全文索引
/* 
  有些时候需要在大篇幅的文章中搜索关键词，比如我写的文章每篇都在万字以上，这时候你想搜索关键字是非常不容易的，
  MongoDB为我们提供了全文索引。
*/


// 准备工作：
/* 
  这节我们先建立一个集合（collections）-info，然后插入一小段文章，作用就是为建立全文索引提供数据，
  当然我们不再建立百万级数据，我们只是看一下效果。
*/
// db.info.insert({ contextInfo: "I am a programmer, I love life, love family. Every day after work, I write a diary." })
// db.info.insert({ contextInfo: "I am a programmer, I love PlayGame, love drink. Every day after work, I playGame and drink."})
// 当然这很简单，再次强调这只是文章需要，实际工作中这么简单的数据没必要建立全文索引。


// 建立全文索引
// db.info.ensureIndex({contextInfo:'text'});
// 需要注意的是这里使用text关键词来代表全文索引，我们在这里就不建立数据模型了。
/* 
  db.info.getIndexes(); 看一下全文索引长啥样
  [
      {
              "v" : 2,
              "key" : {
                      "_id" : 1
              },
              "name" : "_id_",
              "ns" : "demo15.info"
      },
      {
              "v" : 2,
              "key" : {
                      "_fts" : "text",
                      "_ftsx" : 1
              },
              "name" : "contextInfo_text",
              "ns" : "demo15.info",
              "weights" : {
                      "contextInfo" : 1
              },
              "default_language" : "english",
              "language_override" : "language",
              "textIndexVersion" : 3
      }
  ]
*/


// 全文索引查找 
/* 
  建立好了全文索引就可以查找了，查找时需要两个关键修饰符:
  1. $text:表示要在全文索引中查东西。
  2. $search:后边跟查找的内容.
*/
db.info.find({$text:{$search:'programmer'}},{_id:0});  //查处两条数据


// 查找多个词
/* 
  全文索引是支持多个次查找的，比如我们希望查找数据中有programmer，family，diary，drink的数据（这是或的关系），
  所以两条数据都会出现。
*/
db.info.find({ $text: { $search:'programmer，family，diary，drink'}});
// 如果我们这时候希望不查找出来有drink这个单词的记录，我们可以使用“-”减号来取消。
db.info.find({ $text: { $search: 'programmer，family，diary，-drink' } });



// 转义符：
/* 
  全文搜索中是支持转义符的，比如我们想搜索的是两个词（love PlayGame和drink），这时候需要使用\斜杠来转意。
*/
db.info.find({ $text: { $search:"\"love PlayGame\" drink"}},{_id:0})



// 总结:
/* 
  总结：全文索引在工作还是经常使用的，比如博客文章的搜索，长文件的关键词搜索，这些都需要使用全文索引来进行。
  这节课的知识并不难，还是那句话，你看是不可能学会的，一定要动手练习。当然索引还有很多知识，
  这里我们只讲最常用的知识，把小伙伴引入门就好，也就是常说的用20%的精力，学会80%的知识，
  然后在工作中进行迭代磨练。虽然MongoDB的索引文章结束了，但是MongoDB的文章还没有结束，
  下篇文章开始学习如何管理MongoDB。
*/


